package geraeteverwaltung;


import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.ResourceBundle;


/**
 * Die Klasse zur Persistierung der Benutzer und Gerätelisten.
 * @author user
 */
public class PersistenteDaten
{
    //Ref zu geraeteverwaltung.properties
    ResourceBundle res = ResourceBundle.getBundle("geraeteverwaltung.geraeteverwaltung");

    private GeraeteManager geraetemanager;
    private BenutzerManager benutzermanager;

    private final String geraetedatei = res.getString("datei.geraete");
    private final String benutzerdatei = res.getString("datei.benutzer");

    
    public PersistenteDaten ()
    {
        // Geraetedatei anlegen, falls nicht vorhanden
        pruefeDateiexistenz(geraetedatei);

        // Benutzerdatei anlegen, falls nicht vorhanden
        pruefeDateiexistenz(benutzerdatei);

    }

    /**
     * Prüft die Existenz der übergebenen Datei und
     * legt sie an, falls nicht vorhanden.
     * @param datei 
     */
    private void pruefeDateiexistenz (String datei) {
        File file = new File(datei);
        if(!file.exists())
        {
            try {
                PrintWriter pwriter = new PrintWriter(datei);
                pwriter.close();
            } catch (IOException e) 
            {
                e.getMessage();
            }
        }
    }

    /**
     * Setter für das Attribut geraetemanager
     * @param geraetemanager 
     */
    public void setGeraeteManager (GeraeteManager geraetemanager) {
        this.geraetemanager = geraetemanager;
    }
    
    /**
     * Getter für das Attribut geraetemanager
     * @return geraetemanager
     */
    public GeraeteManager getGeraeteManager ()
    {
        return geraetemanager;
    }
    
    /**
     * Setter für das Attribut benutzermanager
     * @param benutzermanager 
     */
    public void setBenutzerManager (BenutzerManager benutzermanager)
    {
        this.benutzermanager = benutzermanager;
    }
    
    /**
     * Getter für das Attribut benutzermanager
     * @return benutzermanager
     */
    public BenutzerManager getBenutzerManager ()
    {
        return benutzermanager;
    }
    
    /**
     * Ruft das Schreiben der Benutzer bzw. Geraete auf.
     * @param typ 
     */
    public void schreibeInDatei(String typ)
    {
        switch (typ) 
        {
            case "Geraete":
                schreibe(geraetedatei, typ);
                break;
            case "Benutzer":
                schreibe(benutzerdatei, typ);
                break;
            default:
                ;;
        }
    }

    /**
     * Ruft das Laden der Benutzer bzw. Geraete auf.
     * @param typ 
     */
    public void ladeAusDatei(String typ)
    {
        switch (typ) 
        {
            case "Geraete":
                lade(geraetedatei, typ);
                break;
            case "Benutzer":
                lade(benutzerdatei, typ);
                break;
            default:
                ;;
        }
    }

    /**
     * Schreibt in die angegebene Datei die Benutzer bzw. Geraete.
     * @param datei 
     */
    private void schreibe (String datei, String typ)
    {
        try {
            FileOutputStream fileOut = new FileOutputStream(datei);
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            switch (typ) 
            {
                case "Geraete":
                    out.writeObject(geraetemanager.getGeraeteliste());
                    break;
                case "Benutzer":
                    out.writeObject(benutzermanager.getBenutzerliste());
                    break;
                default:
                    ;;
            }
            out.close();
            fileOut.close();
            System.out.println("\nSerialisierung erfolgreich.\n");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Lädt aus der angegebene Datei die Benutzer bzw. Geraete.
     * @param datei 
     */
    private void lade (String datei, String typ)
    {
        try {
            FileInputStream fileIn = new FileInputStream(datei);
            if (fileIn.available() == 0) 
            {
                System.out.println(datei + " enthält keine Daten.");
                fileIn.close();
                return;
            }
            ObjectInputStream in = new ObjectInputStream(fileIn);
            switch (typ) 
            {
                case "Geraete":
                    geraetemanager.setGeraeteliste((ArrayList<Geraet>) in.readObject());
                    break;
                case "Benutzer":
                    benutzermanager.setBenutzerliste((ArrayList<Benutzer>) in.readObject());
                    break;
                default:
                    ;;
            }
            in.close();
            fileIn.close();
            System.out.println("\nDeserialisierung erfolgreich.\n");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }
            
} // Ende Klasse PersistenteDaten
